采用“自定义消息映射”来做即可。
step1:在头文件中声明你自己的消息处理函数,例如上文中的“afx_msg void OnMouseMove(UINT nButton, UINT nFlags, CPoint point)”。
step2:在cpp文件中将WM_MOUSEMOVE消息与处理函数关联起来“ON_MESSAGE(WM_MOUSEMOVE,OnMouseMove)”。注意:如果你以前添加过MFC的OnMouseMove(UINT nFlags, CPoint point)函数的话,需要把“ON_WM_MOUSEMOVE()”注释掉。
step3:在TestView类里面实现你的处理函数void OnMouseMove(UINT nButton, UINT nFlags, CPoint point)的函数体。
一、messagebox的原始调用方法 我们随便新建一个MFC的对话框工程,先给出两种messagebox的调用方法,如下所示: void CMy200Dlg::OnBnClickedButton1() { //1. 调用CMy200Dlg类基类CWnd的方法MessageBox MessageBox(_T("CWnd's method!"),_T("123!"),0); //2. 调用windows API的MessageBox function ::MessageBox(NULL,_T("API funtion!"),NULL,0); } 二、CMy200Dlg类中对messagebox方法的重载 下面来改造MessageBox这个函数,第1种是在CMy200Dlg这个类中重载 //d:\My Documents\Visual Studio 2005\Projects\200\200\200Dlg.h class CMy200Dlg : public CDialog { public: int MessageBox(); }; //d:\My Documents\Visual Studio 2005\Projects\200\200\200Dlg.cpp int CMy200Dlg::MessageBox() { int a=0,b=1; return a+b; } void CMy200Dlg::OnBnClickedButton1() { //方法1. 调用CMy200Dlg类基类CWnd的方法MessageBox CWnd::MessageBox(_T("CWnd's method!"),_T("123!"),0); //方法2. 调用windows API的MessageBox function ::MessageBox(NULL,_T("API funtion!"),NULL,0); //方法3. 调用重载的MessageBox() MessageBox(); } 为什么1.中的MessageBox必须加上CWnd::限定符,因为在CMy200Dlg中重载了MessageBox后会对基类的函数进行覆盖,这个是必须要引起注意的。 三、全局中对messagebox方法的重载 下面继续来重载MessageBox这个函数,第2种是在全局中进行重载 int CMy200Dlg::MessageBox() { int a=0,b=1; return a+b; } int MessageBox(int aa,int bb) { return aa*bb; } void CMy200Dlg::OnBnClickedButton1() { //1. 调用CMy200Dlg类基类CWnd的方法MessageBox CWnd::MessageBox(_T("CWnd's method!"),_T("123!"),0); //2. 调用windows API的MessageBox function ::MessageBox(NULL,_T("API funtion!"),NULL,0); //3. 调用重载的MessageBox() MessageBox(); //4. 调用重载的全局函数 MessageBox(int aa,int bb) ::MessageBox(20,14); } 记住全局函数的调用加上::作用域符号就可以了。 四、结论: 一个知识点的灵活运用关键是勤动手,多调试,多去思考和总结。作为上一篇函数的重载就这样讲完了,但是子类对基类的覆盖这个概念没有展开来说,留给以后再去细说吧。